export enum WarningType {
    OVERALL = 1, // 总体
    TASK = 2, // 任务
    NAVIGATION = 3, // 导航
    FLIGHT = 5, // 飞行性能
    VLAND = 6, // 视觉降落
    SENSOR = 7, // 传感器故障
    SIMULATION = 8, // 仿真
}

export interface IFlightInfo {
    // 模式相关 (uint8)
    task_mode: number; // 任务模式
    uav_mode: number; // 飞机模式
    control_mode: number; // 控制模式
    type_warning: number; // 告警类型

    // 告警变量 (uint16)
    var1: number; // 告警变量1
    var2: number; // 告警变量2
    var3: number; // 告警变量3
    var4: number; // 告警变量4 (uint8)
    var5: number; // 告警变量5 (uint8)

    // 告警状态 (uint16)
    task_warning: number; // task告警
    nav_warning: number; // nav告警
    sensor_warning: number; // sensor告警

    // 视觉降落状态 (uint8)
    vland_status: number;
}

export interface IFlight {
    state: IFlightInfo;
}

export class Flight implements IFlight {
    state: IFlightInfo;

    constructor(data: IFlightInfo) {
        this.state = data;
    }

    static fromParams(buffer: ArrayBuffer) {
        // // 使用示例
        // // const array = [3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 1];
        // const buffer = new ArrayBuffer(data.length);
        // const uint8Array = new Uint8Array(buffer);
        // data.forEach((value, index) => {
        //     uint8Array[index] = value;
        // });
        // // const flight = Flight.fromParams(buffer);

        const view = new DataView(buffer);
        let offset = 0;

        const flightInfo: IFlightInfo = {
            // 读取模式相关数据 (uint8)
            task_mode: view.getUint8(offset++),
            uav_mode: view.getUint8(offset++),
            control_mode: view.getUint8(offset++),
            type_warning: view.getUint8(offset++),

            // 读取告警变量 (uint16)
            var1: view.getUint16(offset, true),
            var2: view.getUint16((offset += 2), true),
            var3: view.getUint16((offset += 2), true),

            // 读取告警变量 (uint8)
            var4: view.getUint8((offset += 2)),
            var5: view.getUint8((offset += 1)),

            // 读取告警状态 (uint16)
            task_warning: view.getUint16((offset += 1), true),
            nav_warning: view.getUint16((offset += 2), true),
            sensor_warning: view.getUint16((offset += 2), true),

            // 读取视觉降落状态 (uint8)
            vland_status: view.getUint8((offset += 2)),
        };

        return new Flight(flightInfo);
    }

    // static fromParams(input: ArrayBuffer | number[]) {
    //     let view: DataView;

    //     if (Array.isArray(input)) {
    //         const buffer = new ArrayBuffer(input.length);
    //         const uint8Array = new Uint8Array(buffer);
    //         input.forEach((value, index) => {
    //             uint8Array[index] = value;
    //         });
    //         view = new DataView(buffer);
    //     } else {
    //         view = new DataView(input);
    //     }

    //     let offset = 0;

    //     const flightInfo: IFlightInfo = {
    //         // 读取模式相关数据 (uint8) - 每个占1字节
    //         task_mode: view.getUint8(offset++), // 0
    //         uav_mode: view.getUint8(offset++), // 1
    //         control_mode: view.getUint8(offset++), // 2
    //         type_warning: view.getUint8(offset++), // 3

    //         // 读取告警变量 (uint16) - 每个占2字节
    //         var1: view.getUint8(offset) | (view.getUint8(offset + 1) << 8),
    //         var2: view.getUint8(offset + 2) | (view.getUint8(offset + 3) << 8),
    //         var3: view.getUint8(offset + 4) | (view.getUint8(offset + 5) << 8),

    //         // 读取告警变量 (uint8) - 每个占1字节
    //         var4: view.getUint8(offset + 6),
    //         var5: view.getUint8(offset + 7),

    //         // 读取告警状态 (uint16) - 每个占2字节
    //         task_warning: view.getUint8(offset + 8) | (view.getUint8(offset + 9) << 8),
    //         nav_warning: view.getUint8(offset + 10) | (view.getUint8(offset + 11) << 8),
    //         sensor_warning: 0, // 由于输入数组长度限制，这里设置为默认值

    //         // 读取视觉降落状态 (uint8) - 占1字节
    //         vland_status: view.getUint8(offset + 12),
    //     };

    //     return new Flight(flightInfo);
    // }
}

function base64ToArrayBuffer(base64: string): ArrayBuffer {
    // 1. 将 base64 转换为二进制字符串
    const binaryString = window.atob(base64);

    // 2. 创建一个等长的 ArrayBuffer
    const buffer = new ArrayBuffer(binaryString.length);

    // 3. 创建一个 Uint8Array 视图来写入数据
    const view = new Uint8Array(buffer);

    // 4. 将每个字符的 ASCII 码写入 ArrayBuffer
    for (let i = 0; i < binaryString.length; i++) {
        view[i] = binaryString.charCodeAt(i);
    }

    return buffer;
}

// 使用示例
const base64String = 'AwEDAQMAAQADAAEDBAAFAAgAAQ==';
const arrayBuffer = base64ToArrayBuffer(base64String);
const flight = Flight.fromParams(arrayBuffer);

console.log(flight);
